package com.mjf.scala.chapter07

/**
 * 集合计算高级函数
 */
object Scala12_TestFun {
  def main(args: Array[String]): Unit = {

    val list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)

    // （1）过滤:遍历一个集合并从中获取满足指定条件的元素组成一个新的集合
    val newList: List[Int] = list.filter(_ % 2 == 0) // 将偶数放入新集合
    println(newList)  // List(2, 4, 6, 8)

    // （2）转化/映射（map）:将集合中的每一个元素映射到某一个函数
    println(list.map(_ * 2))    // List(2, 4, 6, 8, 10, 12, 14, 16, 18) 集合元素集体乘2

    // （3）扁平化 :::
    val list1: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
    list1.flatten.foreach(println)  // flatten将整体拆分成个体

    // （4）扁平化+映射 注：flatMap相当于先进行map操作，在进行flatten操作，集合中的每个元素的子元素映射到某个函数并返回新集合
    val strings: List[String] = List("hello java", "hello hadoop", "hello scala")
//    println(strings.map(_.split(" ")).flatten)  // List(hello, java, hello, hadoop, hello, scala)
    val flatMapList: List[String] = strings.flatMap(_.split(" "))
    println(flatMapList)  // List(hello, java, hello, hadoop, hello, scala)

    // （5）分组(group):按照指定的规则对集合的元素进行分组
    val groupMap: Map[Int, List[Int]] = list.groupBy(_ % 2) // 奇数放一组，偶数放一组
    println(groupMap)   // Map(1 -> List(1, 3, 5, 7, 9), 0 -> List(2, 4, 6, 8))

    val nameList: List[String] = List("hive", "hadoop", "flume", "spark", "flink")
    val groupMap2: Map[Char, List[String]] = nameList.groupBy(_.charAt(0)) // 将首字母相同的放一组
    println(groupMap2) // // Map(h -> List(hive, hadoop), s -> List(spark), f -> List(flume, flink))


  }
}
